package com.gxar.quick.ar.server.db.mapper;

import com.gxar.quick.ar.server.base.model.user.dto.WorkStatisticsDTO;
import com.gxar.quick.ar.server.base.model.works.dto.WorksListDTO;
import com.gxar.quick.ar.server.db.model.WorksEntity;
import org.apache.ibatis.annotations.Mapper;

import java.util.Date;
import java.util.List;

/**
 * @author linsy
 * @version 1.0
 * @created 2023/11/3 11:14
 */
@Mapper
public interface WorksMapper {

    /**
     * 查询用户的作品
     *
     * @param userId       用户id
     * @param type         类型
     * @param source       作品来源
     * @param queryChannel 查询渠道
     * @return 响应
     */
    List<WorksListDTO> queryPage(Long userId, Integer type, List<Integer> source, Integer queryChannel);

    /**
     * 统计用户已展示次数
     *
     * @param userId 用户ID
     * @return 响应
     */
    WorkStatisticsDTO workStatistics(Long userId);

    /**
     * 统计识别次数
     *
     * @param userId 用户id
     * @return 识别次数
     */
    WorkStatisticsDTO workImpressionsStatistics(Long userId);

    /**
     * 新增浏览次数
     *
     * @param id            作品id
     * @param increaseCount 浏览次数
     */
    void increaseImpressions(Long id, Integer increaseCount);

    /**
     * 批量删除作品
     *
     * @param ids   ids
     * @param limit 长度
     */
    void batchDelete(List<Long> ids, Integer limit);

    /**
     * 批量下线
     *
     * @param ids   作品id集合
     * @param limit 长度
     */
    void batchOffline(List<Long> ids, Integer limit);

    /**
     * 批量上线
     *
     * @param ids
     * @param limit
     */
    void batchOnline(List<Long> ids, Integer limit);

    /**
     * 查询用户下线状态作品。创建时间升序
     *
     * @param userId 用户
     * @param limit  数量
     * @return 响应
     */
    List<WorksEntity> queryUserOfflineOrderByCreatedAt(Long userId, Integer limit);

    /**
     * 根据状态和更新时间查询作品
     *
     * @param deleted   状态
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 响应
     */
    List<WorksEntity> queryByDeletedAndUpdatedAt(Integer deleted, Date startTime, Date endTime);

    /**
     * 根据作品id以及用户id查询作品
     *
     * @param worksId 作品id
     * @param userId  用户id
     * @return 作品
     */
    List<WorksEntity> queryIdsAndUserId(List<Long> worksId, Long userId);

    /**
     * 查询用户可上传识别图的作品
     *
     * @param userId 用户id
     * @return 作品集合
     */
    List<WorksEntity> queryUserCanIdentify(Long userId);

    /**
     * 根据用户兑换品ID查询
     *
     * @param userId             用户ID
     * @param userExchangeItemId 用户兑换品id
     * @return 响应
     */
    List<WorksEntity> queryByUserExchangeItemId(Long userId, Long userExchangeItemId);

    /**
     * 查询可配置兑换品的作品
     *
     * @param worksId 作品ID集合
     * @return 响应
     */
    List<WorksEntity> queryShelvesWorks(List<Long> worksId);

    /**
     * 根据条件查询
     *
     * @param userId  用户ID
     * @param shelves 是否上架
     * @param name    作品名称
     * @return 响应
     */
    List<WorksEntity> queryByUserOrShelves(List<Long> userId, Boolean shelves, String name);

    /**
     * 批量保存
     *
     * @param worksList 集合
     * @return 数量
     */
    Integer saveAll(List<WorksEntity> worksList);
}
